#include "data_redis.h"

#include "log.h"

namespace chat {
// RedisClientFactory

std::shared_ptr<sw::redis::Redis> RedisClientFactory::create(
    const std::string& ip, const uint16_t port, const int db,
    const bool keep_alive) {
    sw::redis::ConnectionOptions opts;
    opts.host = ip;
    opts.port = port;
    opts.db = db;
    opts.keep_alive = keep_alive;

    return std::make_shared<sw::redis::Redis>(opts);
}

// -------------------------------------------------------------------

// Session

bool Session::append(const std::string& session_id, const std::string& uid) {
    if (!client_->set(session_id, uid)) {
        LOG_ERROR("{} 添加redis会话失败", session_id);
        return false;
    }

    return true;
}
bool Session::remove(const std::string& session_id) {
    if (0 == client_->del(session_id)) {
        LOG_ERROR("{} 会话不存在", session_id);
        return false;
    }

    return true;
}
sw::redis::OptionalString Session::uid(const std::string& session_id) {
    return client_->get(session_id);
}

// -------------------------------------------------------------------

// Status

bool Status::append(const std::string& uid) {
    if (!client_->set(uid, "")) {
        LOG_ERROR("{} 添加用户登陆状态失败", uid);
        return false;
    }

    return true;
}
bool Status::remove(const std::string& uid) {
    if (0 == client_->del(uid)) {
        LOG_ERROR("{} 用户状态不存在", uid);
        return false;
    }

    return true;
}
bool Status::exists(const std::string& uid) { return client_->exists(uid); }

// -------------------------------------------------------------------

// Codes

bool Codes::append(const std::string& code_id, const std::string& code,
                   const std::chrono::milliseconds& t) {
    if (!client_->set(code_id, code, t)) {
        LOG_ERROR("{} 添加短信失败", code_id);
        return false;
    }

    return true;
}
bool Codes::remove(const std::string& code_id) {
    if (0 == client_->del(code_id)) {
        LOG_ERROR("{} 短信不存在", code_id);
        return false;
    }

    return true;
}
sw::redis::OptionalString Codes::code(const std::string& code_id) {
    return client_->get(code_id);
}
}  // namespace chat